//============================================================================================
/**
 * @file	h_smog_generate.c
 * @brief	ポケスロン競技：障害物競走　土煙ジェネレーター
 * @author	Nozomu Saito
 *
 * モジュール名：H_SMOG_GENE_
 */
//============================================================================================

#include "common.h"
#include "pkthln_hurdle_cmn_def.h"

#include "../pkthln_act_def.h"
#include "h_smog_generate.h"
#include "hurdle_obj_pri.h"

typedef struct H_SMOG_tag
{
	BOOL Valid;
	PKTHLN_ACT_PTR	ActPtr;
}H_SMOG;

typedef struct H_SMOG_LIST_tag
{
	H_SMOG Smog[SMOG_STACK_NUM];
	u32 NowIdx;
}H_SMOG_LIST;

typedef struct H_SMOG_GENERATE_tag
{
	H_SMOG_LIST SmogList[LANE_NUM];
}H_SMOG_GENERATE;


static void PushSmog(H_SMOG *pSmog);

//--------------------------------------------------------------------------------------------
/**
 * 初期化
 *
 * @param	inHeapID	ヒープID
 *
 * @return	ptr			ジェネレータポインタ
 */
//--------------------------------------------------------------------------------------------
H_SMOG_GENE_PTR H_SMOG_GENE_Init(const int inHeapID)
{
	int size;
	H_SMOG_GENE_PTR ptr;
	size = sizeof(H_SMOG_GENERATE);
	ptr = sys_AllocMemory(inHeapID, size);
	MI_CpuClear8(ptr, size);
	return ptr;
}

//--------------------------------------------------------------------------------------------
/**
 * アクターセットアップ
 *
 * @param	ptr				ジェネレータポインタ
 * @param	act_cnt_ptr		アクターコントローラ
 * @param	inBGPri			BGプライオリティ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void H_SMOG_GENE_Setup(H_SMOG_GENE_PTR ptr, PKTHLN_CLACT_CNT_PTR act_cnt_ptr, const u8 inBGPri)
{
	u8 i,j;
	for (i=0;i<LANE_NUM;i++){
		H_SMOG_LIST *list;
		list = &ptr->SmogList[i];
		for (j=0;j<SMOG_STACK_NUM;j++){
			list->Smog[j].ActPtr = PkthlnClAct_SetGetActor(	act_cnt_ptr, inBGPri,
															NNS_G2D_VRAM_TYPE_2DMAIN,
															RES_CODE_BWATCH, ACT_CODE_BSMOG);
			PkthlnClAct_SetActive(list->Smog[j].ActPtr, 1, 0);
			//プライオリティセット
			PkthlnClAct_SetPriority(list->Smog[j].ActPtr, PRI_SMOG);
		}
	}
}

//--------------------------------------------------------------------------------------------
/**
 * 終了
 *
 * @param	ptr			ジェネレータポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void H_SMOG_GENE_End(H_SMOG_GENE_PTR ptr)
{
	sys_FreeMemoryEz(ptr);
}

//--------------------------------------------------------------------------------------------
/**
 * 生成
 *
 * @param	ptr				ジェネレータポインタ
 * @param	inLane			レーン番号
 * @param	inVec			生成位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void H_SMOG_GENE_Generate(H_SMOG_GENE_PTR ptr, const u8 inLane, const VecFx32 *inVec )
{
	H_SMOG_LIST *list;
	H_SMOG *smog;
	GF_ASSERT(inLane < LANE_NUM);
	list = &ptr->SmogList[inLane];

	smog = &list->Smog[list->NowIdx];
	//現在の参照場所は未使用常態化を調べる
	if ( !smog->Valid ){
		//アクターを表示
		PkthlnClAct_SetActive(smog->ActPtr, 1, 1);
		//アニメセット
		PkthlnClAct_ChgAnm(smog->ActPtr,1);
		//座標セット
		PkthlnClAct_SetPos(smog->ActPtr, inVec);
		//未使用なので、使用可
		smog->Valid = TRUE;
		//参照位置更新
		list->NowIdx = (list->NowIdx+1)%SMOG_STACK_NUM;
	}else{
		GF_ASSERT_MSG(0,"使用中です。スタックが足りません\n");
	}
}

//--------------------------------------------------------------------------------------------
/**
 * 動作
 *
 * @param	ptr				ジェネレータポインタ
 * @param	inLane			レーン番号
 * @param	inSpeed			移動スピード
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void H_SMOG_GENE_Move(H_SMOG_GENE_PTR ptr, const u8 inLane, const int inSpeed)
{
	u8 i;
	H_SMOG_LIST *list;
	GF_ASSERT(inLane < LANE_NUM);
	list = &ptr->SmogList[inLane];

	for (i=0;i<SMOG_STACK_NUM;i++){
		H_SMOG *smog;
		smog = &list->Smog[i];
		if ( !smog->Valid ){
			continue;
		}else{
			VecFx32 vec;
			//座標取得
			vec = *PkthlnClAct_GetPos(smog->ActPtr);
			//移動
			vec.y += (inSpeed*FX32_ONE);
			PkthlnClAct_SetPos(smog->ActPtr, &vec);
/**
			//移動の結果画面の下に到達し、画面に見えなくなったか？
			if(vec.y / FX32_ONE >= ){
				//寿命　返却してよし
				PushSmog(smog);
				continue;
			}
*/
			//アニメが終了しているか？
			if (!PkthlnClAct_AnmActiveCheck(smog->ActPtr)){
				//寿命　返却してよし
				PushSmog(smog);
				continue;
			}
		}
	}
}

//--------------------------------------------------------------------------------------------
/**
 * 土煙アクター返却
 *
 * @param	pSmog		土煙アクター
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void PushSmog(H_SMOG *pSmog)
{
	pSmog->Valid = FALSE;
	//アクターバニッシュ
	PkthlnClAct_SetActive(pSmog->ActPtr, 1, 0);
}

